home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-09-01 | 3.0 KB | 121 lines | [TEXT/KAHL] |
- //
- // "XcShell" Skeletal XCMD/XFCN XCMD subfunction checks and router
- //
- // Copyright ©1991 Mark M. Owen -- All rights reserved
- //
-
- #define _XCMD_
-
- #include "XCMDutils.h"
- #include "XCMDversion.h"
- #include "XCMD.h"
-
-
- #define STRING(n) *(paramPtr->params[(n)])
- #define ERROR(msg) { Fail( paramPtr, (msg) ); return false; }
- #define CHKERROR(msg) { int err = (msg); if(err) ERROR(err); }
-
-
- semiprivate void UnlockParams (XCmdBlockPtr paramPtr);
- semiprivate void Fail (XCmdBlockPtr paramPtr,int msg);
- semiprivate int verbNumber (char *theVerb,pGlobals pGlb);
-
-
- int XCMD(XCmdBlockPtr paramPtr,hGlobals hGlb)
- {
- GrafPtr port;
- Boolean rtn = LIVE;
- char str[256];
- char verbStr[256];
- int theVerb;
- int nParams;
- long ip[16];
-
- register
- int i = 16;
- register
- pGlobals pGlb;
- register
- long *pip= ip;
-
- while( i-- ) *pip++ = 0; // clear the long parameter containers
-
- GetPort( &port ); // save current port for later restoration
-
- global_paramPtr = paramPtr; // used by SetReturnValue
- SetReturnValue( "\p" ); // assure empty result initially
-
- if( !hGlb ) // caller supplied no globals…
- return DEAD;
-
- for(i=0;i<paramPtr->paramCount;i++) { // immobilize the parameter handles
- MoveHHi( (Handle)paramPtr->params[i] );
- HLock( (Handle)paramPtr->params[i] );
- }
-
- if( paramPtr->paramCount < 1 ) // need at least a verb (XCMD function)
- ERROR( errMissingFunction );
-
- pGlb = *hGlb; // dereference global handle
-
- // attempt to decode the verb
-
- zero2pas( STRING(0), verbStr ); // convert C string to Pascal
-
- if( (theVerb = verbNumber( verbStr, pGlb )) == vInError )
- ERROR( errUnrecognizedVerb );
-
- nParams = ( theVerb >= 0 && theVerb < pGlb->nVerbs )?
- *(((char*)((*((short**)(pGlb->hNParams)))+1))+theVerb) + 1 // Get minimum number of parameters expected
- :
- 32767
- ;
-
- // Check parameter count limits for verbs with optional parameters. If an optional
- // parameter is missing, supply an appropriate default value.
-
- switch( theVerb ) {
-
- //////////////////////////////////////////////////////////////
- // verify variable parameter count verbs here… //
- //////////////////////////////////////////////////////////////
-
- default:
- if( paramPtr->paramCount != nParams )
- ERROR( errWrongParamCount );
- }
-
- if (nParams > 1 ) { // convert parameter strings to internal numeric formats
- i = 0;
- pip = ip;
- while( i < nParams ) {
- zero2pas( STRING( i++ ), str );
- StringToNum( str, pip++ );
- }
- }
-
- switch( theVerb ) { // Either do the verb here here or delegate it
-
- case vVersion:
- XCMDVersion();
- break;
-
- case vDispose:
- rtn = DEAD;
- break;
-
- //////////////////////////////////////////////////////////////
- // as in the above cases, route to other verbs here… //
- //////////////////////////////////////////////////////////////
-
- default:
- ERROR( errUnrecognizedVerb );
- break;
- }
-
- UnlockParams( paramPtr ); // unlock some of our locked memory
- SetPort( port ); // restore the port in case it was changed
-
- return rtn;
- }
-